Django + gunicorn のログ出力設定
code:shell
$ django-admin startproject apps
code:settings.py
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': ('%(levelname)s %(asctime)s %(name)s %(message)s'), },
'verbose': {
'format': '%(levelname)s %(asctime)s %(name)s %(process)d %(thread)d %(message)s'
},
},
'filters': {
'require_debug_false': {
'()': 'django.utils.log.RequireDebugFalse'
},
'require_debug_true': {
'()': 'django.utils.log.RequireDebugTrue'
},
},
'handlers': {
'debug-console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'verbose'
},
'prod-console': {
'level': 'INFO',
'class': 'logging.StreamHandler',
'formatter': 'standard'
}
},
'loggers': {
'': { # 'root' の代わり。全てキャッチする
'level': 'NOTSET',
'propagate': False
},
'django': {
'level': 'ERROR', # Djangoモジュール由来のログをERROR以上のみに制限
'propagate': False
},
'django.request': {
'level': 'ERROR', # Djangoモジュール由来のログをERROR以上のみに制限
'propagate': False,
},
'django.db.backends': {
'level': 'DEBUG', # DBに発行するSQLログを出力(実際の出力はhandlerの方で制御する)
'propagate': False
},
}
}
アプリレベルでリクエスト処理開始と終了をログ出力したい場合これを追加
apps/apps/middleware.py
code:python
MIDDLEWARE = [
...
'apps.middleware.request_log_middleware',
]
code:python
import logging
import uuid
logger = logging.getLogger(__name__)
def request_log_middleware(get_response):
def middleware(request):
endpoint = request.get_full_path()
request_id = str(uuid.uuid4()) # requestにIDがあればそっちがいいな
logger.debug(f'start reqid={request_id} endpoint={endpoint}')
response = get_response(request)
logger.debug(f'end reqid={request_id} endpoint={endpoint} status={response.status_code}')
# 処理にかかった時刻情報もあるとよいかも
return response
return middleware
code:shell
$ gunicorn \
--workers 2 \
--bind 127.0.0.1:8000 \
--access-logfile - \ # gunicorn自体にアクセスログを出力させたい場合
--capture-output \ # Pythonからのログ出力をstdout/stderrにしている場合、必要
--log-level debug \ # gunicorn自体のデバッグログを出力させたい場合
apps.wsgi # Djangoのwsgiモジュールパス
--capture-output オプションは gunicorn 19.6 で追加
--error-logfile オプションは gunicorn 19.2 以降デフォルトで - が設定される